#pragma strict

@script RequireComponent (PerFrameRaycast)

var bulletPrefab : GameObject;
var spawnPoint : Transform;
var frequency : float = 10;
var coneAngle : float = 1.5;
var firing : boolean = false;
var damagePerSecond : float = 20.0;
var forcePerSecond : float = 20.0;
var hitSoundVolume : float = 0.5;
var asource : AudioSource;
var muzzleFlashFront : GameObject;

private var lastFireTime : float = -1;
private var raycast : PerFrameRaycast;

function Awake () {

	StartCoroutine(CheckForController());
	asource = GetComponent("AudioSource");
	muzzleFlashFront.SetActive (false);

	raycast = GetComponent.<PerFrameRaycast> ();
	if (spawnPoint == null)
		spawnPoint = transform;
}

function CheckForController()
{
	#if UNITY_IPHONE
	yield WaitForSeconds(0.5);

	var JL : GameObject = GameObject.Find("Joystick Left");
	var JR : GameObject = GameObject.Find("Joystick Right");

	while(true)
	{
		if(!JL||!JR)
		{
			JL = GameObject.Find("Joystick Left");
			JR = GameObject.Find("Joystick Right");
		}

		if(JL&&JR)
		{
			var sticks : String[] = Input.GetJoystickNames();

			if(sticks.Length>0)
			{
				JL.active = false;
				JR.active = false;
				GLOBAL.isJSConnected = true;
				GLOBAL.isJSExtended = !sticks[0].StartsWith("[basic,");
			}
			else
			{
				JL.active = true;
				JR.active = true;
				GLOBAL.isJSConnected = false;
			}
		}

		yield WaitForSeconds(1.0);
	}
	#endif

	yield WaitForSeconds (0.5);
}

function Update ()
{
	if(GLOBAL.isJSConnected)
	{
		var axisX : float = Input.GetAxis("RightHorizontal");
		var axisY : float = Input.GetAxis("RightVertical");

		if(Input.GetButtonDown("Joystick button 15") || (!firing && GLOBAL.isJSExtended && Mathf.Abs(axisX) + Mathf.Abs(axisY) > 0.0))
		{
			if (Time.timeScale == 0)
				return;

			firing = true;

			muzzleFlashFront.SetActive (true);

			if (asource)
			{
				asource.Play ();
			}
		}

		if(Input.GetButtonUp("Joystick button 15") || (firing && GLOBAL.isJSExtended && Mathf.Abs(axisX) + Mathf.Abs(axisY) < 0.01))
		{
			firing = false;

			muzzleFlashFront.SetActive (false);

			if (asource)
				asource.Stop ();
		}
	}

	if (firing) {

		if (Time.time > lastFireTime + 1 / frequency) {
			// Spawn visual bullet
			var coneRandomRotation = Quaternion.Euler (Random.Range (-coneAngle, coneAngle), Random.Range (-coneAngle, coneAngle), 0);
			var go : GameObject = Spawner.Spawn (bulletPrefab, spawnPoint.position, spawnPoint.rotation * coneRandomRotation) as GameObject;
			var bullet : SimpleBullet = go.GetComponent.<SimpleBullet> ();

			lastFireTime = Time.time;

			// Find the object hit by the raycast
			var hitInfo : RaycastHit = raycast.GetHitInfo ();
			if (hitInfo.transform) {
				// Get the health component of the target if any
				var targetHealth : Health = hitInfo.transform.GetComponent.<Health> ();
				if (targetHealth) {
					// Apply damage
					targetHealth.OnDamage (damagePerSecond / frequency, -spawnPoint.forward);
				}

				// Get the rigidbody if any
				if (hitInfo.rigidbody) {
					// Apply force to the target object at the position of the hit point
					var force : Vector3 = transform.forward * (forcePerSecond / frequency);
					hitInfo.rigidbody.AddForceAtPosition (force, hitInfo.point, ForceMode.Impulse);
				}

				// Ricochet sound
				var sound : AudioClip = MaterialImpactManager.GetBulletHitSound (hitInfo.collider.sharedMaterial);
				AudioSource.PlayClipAtPoint (sound, hitInfo.point, hitSoundVolume);

				bullet.dist = hitInfo.distance;
			}
			else {
				bullet.dist = 1000;
			}
		}
	}
}

function OnStartFire () {
	if (Time.timeScale == 0)
		return;

	firing = true;

	muzzleFlashFront.SetActive (true);

	if (audio)
		audio.Play ();
}

function OnStopFire () {
	firing = false;

	muzzleFlashFront.SetActive (false);

	if (audio)
		audio.Stop ();
}
